package offer.day17;

public class No29PrintMatrixClockwisely {
    /*
     * 面试题29：逆时针打印矩阵
     * 题目：输入一个矩阵，按照从外向里以顺时针的顺序一次打印出每一个数字。
     * 例如：输入 1，2，3，4（第一行），5，6，7，8（第二行），9，10，11，12（第三行），13，14，15，16
     *
     *
     * 思路：用一个循环来打印矩阵，每次打印矩阵中的一圈
     *     clockwisely   顺时针地    matrix   矩阵
     *     循环停止条件 ： columns<=start*2  && rows<=start*2    5<=2*2;6<=2*2;6<=3*2
     *
     *     其中  startX  起始行号———   startY 起始列号|
     *     	   endX    结束行号———    endY  结束列号|
     *         columns  行数———       rows  列数|
     *
     * */
    public static void main(String[] args) {
        No29PrintMatrixClockwisely p = new No29PrintMatrixClockwisely();
        int[][] numbers = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}, {13, 14, 15, 16}};
        int columns = 4;
        int rows = 4;
        p.PrintMatrixClockwisely(numbers, columns, rows);
    }

    private void PrintMatrixClockwisely(int[][] numbers, int columns, int rows) {
        if (numbers == null || columns <= 0 || rows <= 0) return;
        int startX = 0;
        int startY = 0;
        while (columns > startX * 2 && rows > startY * 2) {
            PrintMatrixClock(numbers, columns, rows, startX, startY);
            startX++;
            startY++;
        }
    }

    private void PrintMatrixClock(int[][] numbers, int columns, int rows, int startX, int startY) {
        int endX = rows - startX - 1;//行
        int endY = columns - startY - 1;//列

        for (int i = startY; i <= endY; i++) {
            System.out.print(numbers[startX][i] + " ");
        }

        for (int i = startX + 1; i <= endX; i++) {
            System.out.print(numbers[i][endY] + " ");
        }


        for (int i = endY - 1; i >= startY; i--) {
            System.out.print(numbers[endX][i] + " ");
        }


        for (int i = endX - 1; i >= startX + 1; i--) {
            System.out.print(numbers[i][startY] + " ");
        }

    }
}
